#include "cliente.h"
#include <mqueue.h>
#include <semaphore.h>
#include <errno.h>
#include <stdio.h>

Cliente::Cliente() {
    connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
}

void Cliente::run() {
    QString cadena = toString();
    char str[8];
    sprintf(str, "/cola%c", cajero + 96);
    sem_t* semaforo = sem_open(str, O_RDWR);
    if (semaforo == SEM_FAILED)
        perror("Error creando o abriendo el semaforo");
    mqd_t buzon =  mq_open(str, O_RDWR);
    if (buzon == (mqd_t) - 1)
        perror("Error creando o abriendo el buzon");
    sem_wait(semaforo);
    if (mq_send(buzon, cadena.toAscii().constData(), cadena.length(), 0) == -1)
        perror("Error mandando el mensaje");
    emit clienteAgregado(cajero, imagen, operacion, monto);
    mq_close(buzon);
    sem_close(semaforo);
}

void Cliente::setCajero(int cajero) {
    this->cajero = cajero;
}

int Cliente::getCajero() {
    return cajero;
}

void Cliente::setOperacion(int operacion) {
    this->operacion = operacion;
}

int Cliente::getOperacion() {
    return operacion;
}

void Cliente::setMonto(float monto) {
    this->monto = monto;
}

float Cliente::getMonto() {
    return monto;
}

void Cliente::setImagen(int imagen) {
    this->imagen = imagen;
}
int Cliente::getImagen() {
    return imagen;
}

void Cliente::setVentanaSimulacion(VentanaSimulacion* ventanaSimulacion) {
    this->ventanaSimulacion = ventanaSimulacion;
    connect(this, SIGNAL(clienteAgregado(int, int, int, float)), ventanaSimulacion, SLOT(agregar(int, int, int, float)));
}

QString Cliente::toString() {
    return QString::number(operacion) + "-" + QString::number(monto);
}
